#include "userinfo.h"
#include <myhead.h>

link_t* link_create(){
	link_t* L=(link_t*)malloc(sizeof(link_t));
	if(L == NULL){
		fprintf(stderr,"链表初始化失败,malloc error\n");
		return NULL;
	}
	L->len=0;
	L->next=NULL;
	return L;
}

void link_destroy(link_t* L){
	node_t* p=L->next;
	for(int i=0;i<L->len;i++){
		node_t* temp=p;
		p=p->next;
		free(temp);
	}
	free(L);
}

void link_insertHead(link_t* L, userinfo_t user){
	node_t *p=(node_t*)malloc(sizeof(node_t));
	p->next=L->next;
	L->next=p;
	memcpy(&p->data, &user, sizeof(userinfo_t));
	L->len++;
	printf("链表:节点插入成功\n");
}

node_t* link_findByUsername(link_t* L, char* username){
	node_t *p=L->next;
	for(int i=0;i<L->len;i++){
		printf("1:[%s],2:[%s]\n",p->data.username,username);
		if(strcmp(p->data.username, username)==0){
			return p;
		}
		p=p->next;
	}
	return NULL;
}

link_t* file_load(){
	link_t* L=link_create();

	//打开文件
	if(access(FILE_PATH, F_OK)){//不存在
		printf("文件不存在，新建文件\n");
		//创建文件
		int fd=open(FILE_PATH, O_WRONLY|O_CREAT|O_TRUNC, 0666);
		close(fd);
		//肯定无数据
		return L;
	}
	printf("文件存在，读取文件数据\n");
	int fd=open(FILE_PATH, O_RDONLY);
	if(fd == -1){
		perror("open error");
		return NULL;
	}

	//读取数据
	userinfo_t u;
	ssize_t cnt;
	while((cnt=read(fd,&u,sizeof(u)))>0 ){
		//将读取数据插入到链表
		printf("读取一次，读取了[%ld]个字节\n",cnt);
		link_insertHead(L, u);
	}
	printf("read completed. cnt=[%ld]\n", cnt);
	
	//关闭文件
	close(fd);
	return L;
}

void file_appendUser(userinfo_t user){
	//打开文件, 程序运行到此处，文件一定存在
	int fd=open(FILE_PATH, O_WRONLY|O_CREAT|O_APPEND, 0666);
	if(fd ==-1){
		perror("file_appenUser:文件打开失败");
		return;
	}
	//追加数据
	ssize_t cnt=write(fd, &user, sizeof(user));
	printf("cnt=[%ld]个字节已经写入\n", cnt);

	//关闭文件
	close(fd);

}
